Human OOPS data CONTENT

  1. Aggregate into master.protein and QC for MCF10A Keep NC proteins represented in CL Find categories of the NC-only proteins Find intersection, highly confident RBP threshold. Aggregate into master.protein and QC for U20S Keep NC proteins represented in CL Find categories of the NC-only proteins Classify U20S into seen once, twice or three-times Find intersection, highly confident RBP threshold.

1*. Intersection between OOPS U20S data 1**. Intersection between Veronica’s SELEX data Not useful: SELEX is relative, cannot conduct enrichment analysis.

  1. Attempt for RBP proteins
library(dplyr)

Attaching package: ‘dplyr’

The following object is masked from ‘package:UniProt.ws’:

    select

The following objects are masked from ‘package:BiocGenerics’:

    combine, intersect, setdiff, union

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(dplyr)
library(tidyr)

Attaching package: ‘tidyr’

The following object is masked from ‘package:RCurl’:

    complete
  1. Aggregate MCF10A peptides into protein identification
peptide_df <- read.table("../raw/MCF10A_sw_only_crap_checked.txt", sep="\t", header=T)
print(head(peptide_df))
print(dim(peptide_df))
[1] 101184     71
print(unique)
function (x, incomparables = FALSE, ...) 
standardGeneric("unique")
<environment: 0x10bf20668>
attr(,"generic")
[1] "unique"
attr(,"generic")attr(,"package")
[1] "BiocGenerics"
attr(,"package")
[1] "BiocGenerics"
attr(,"group")
list()
attr(,"valueClass")
character(0)
attr(,"signature")
[1] "x"
attr(,"default")
Method Definition (Class "derivedDefaultMethod"):

function (x, incomparables = FALSE, ...) 
UseMethod("unique")
<bytecode: 0x10bf1dcb0>
<environment: namespace:base>

Signatures:
        x    
target  "ANY"
defined "ANY"
attr(,"skeleton")
(function (x, incomparables = FALSE, ...) 
UseMethod("unique"))(x, incomparables, ...)
attr(,"class")
[1] "standardGeneric"
attr(,"class")attr(,"package")
[1] "methods"
print(table(peptide_df$filename))

                     filename MCF10A_CL_1_PeptideGroups.txt MCF10A_CL_2_PeptideGroups.txt 
                            9                         13450                         14412 
MCF10A_CL_3_PeptideGroups.txt MCF10A_CL_4_PeptideGroups.txt MCF10A_CL_5_PeptideGroups.txt 
                        15411                         24755                         15683 
MCF10A_NC_1_PeptideGroups.txt MCF10A_NC_2_PeptideGroups.txt MCF10A_NC_3_PeptideGroups.txt 
                         2586                          2330                          3054 
MCF10A_NC_4_PeptideGroups.txt MCF10A_NC_5_PeptideGroups.txt 
                         3942                          5552 
cat("Tally of peptides at each stage:\n")
Tally of peptides at each stage:
cat(sprintf("%s\tAll peptides with a PSM\n", length(rownames(peptide_df))))
101184  All peptides with a PSM
cat(sprintf("These peptides are associated with %s master proteins\n",
            length(unique(peptide_df$master_protein))))
These peptides are associated with 2575 master proteins
#print(table(peptide_df$Quan.Info))
#peptide_df <- peptide_df[peptide_df$Quan.Info=="Unique",]
#cat(sprintf("%s\tExcluding peptides without 'Quan.Info'='Unique'\n", length(rownames(peptide_df))))
peptide_df <- peptide_df[peptide_df$master_protein!="",]
cat(sprintf("%s\tExcluding peptides without a master protein\n", length(rownames(peptide_df))))
89786   Excluding peptides without a master protein
cat(sprintf("These peptides are associated with %s master proteins\n",
            length(unique(peptide_df$master_protein))))
These peptides are associated with 2574 master proteins
peptide_df <- peptide_df[peptide_df$unique==1,]
cat(sprintf("%s\tExcluding peptides without a unique master protein\n", length(rownames(peptide_df))))
84570   Excluding peptides without a unique master protein
cat(sprintf("These peptides are associated with %s master proteins\n",
            length(unique(peptide_df$master_protein))))
These peptides are associated with 2251 master proteins
peptide_df <- peptide_df[peptide_df$crap_protein==0,]
cat(sprintf("%s\tExcluding peptides matching a cRAP protein\n", length(rownames(peptide_df))))
83841   Excluding peptides matching a cRAP protein
cat(sprintf("These peptides are associated with %s master proteins\n",
            length(unique(peptide_df$master_protein))))
These peptides are associated with 2230 master proteins
peptide_df <- peptide_df[peptide_df$associated_crap_protein==0,]
cat(sprintf("%s\tExcluding peptides associated with a cRAP protein\n", length(rownames(peptide_df))))
81098   Excluding peptides associated with a cRAP protein
cat(sprintf("These peptides are associated with %s master proteins\n",
            length(unique(peptide_df$master_protein))))
These peptides are associated with 2199 master proteins
print(head(peptide_df))
protein_df <- peptide_df[,c("master_protein", "filename")]
print(dim(protein_df))
[1] 81098     2
protein_df <- protein_df %>% distinct
print(dim(protein_df))
[1] 10997     2
protein_df <- protein_df %>% separate(col=filename, into=c("_", "treatment", "rep"), sep="_")
Too many values at 10997 locations: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
print(table(protein_df$rep, protein_df$treatment))
   
      CL   NC
  1 1492  416
  2 1622  395
  3 1609  518
  4 2013  567
  5 1627  738

Intersection CL to NC

head(protein_df)
protein_df_NC <- protein_df[protein_df$treatment=='NC',]
length((unique(protein_df_NC$master_protein)))
[1] 863
protein_df_CL <- protein_df[protein_df$treatment=='CL',]
length(unique(protein_df_CL$master_protein))
[1] 2169
common <- intersect(protein_df_NC$master_protein, protein_df_CL$master_protein) 
# There are 30 masterproteins in NC not in CL 
venn <- draw.pairwise.venn(area1 =length(unique(protein_df_CL$master_protein)), area2 = length(unique(protein_df_NC$master_protein)), cross.area = length(common), category = c("CL", "NC"),    fill = c("blue", "red"))
grid.draw(venn)
grid.newpage()

grid.arrange(gTree(children=venn), top="Master_proteins", bottom="30 non-overlapping in the NC data")
Error: could not find function "grid.arrange"

1* Intersect with the previous U20S data

1** MCF10A versus Veronica analysis

#Upload Veronica's data
peptide <- read.table("/Users/ciromonti/Documents/GitHub/ThreeTs/proteomics/trizol/MCF10A/raw/Veronica_TMT_10_Plex_F_PeptideGroups_sw_only_crap_checked.txt", sep="\t", header=T)
#change directory un RStudio to make data more readily accesible 
print(head(peptide))
print(dim(peptide))
print(colnames(peptide))
#QC of the dataset before removing the Master.Proteins.
#Can use sprintf to print the the number of peptides lost at each step. 
#Remove the cRAP proteins
peptide <- peptide  %>% filter(peptide$crap_protein == 0)
#Remove the cRAP associated proteins
peptide <- peptide %>% filter(peptide$associated_crap_protein == 0)
#Keep proteins associted to a unique master protein
peptide <- peptide %>% filter(peptide$unique == 1)
dim(peptide)

peptide <- peptide[, c("Sequence", "master_protein")]
length(peptide$master_protein)
peptide <- data.frame(unique(peptide$master_protein))
#This is the proteomics background for MCF10A. Caveat these are not baseline conditions: insulin-starved or insulin-enriched. 
OOPs_peptide <- OOPs_peptide[, c("Sequence", "master_protein")]
OOPs_peptide <- OOPs_peptide[, c("Sequence", "master_protein")]
length(OOPs_peptide$master_protein)
[1] 81098
OOPs_peptide <- OOPs_peptide[, c("Sequence", "master_protein")]
length(OOPs_peptide$master_protein)
[1] 81098
OOPs_peptide <- data.frame(unique(OOPs_peptide$master_protein))
#Intersection between the datasets 
overlap <- intersect(peptide$unique.peptide.master_protein., OOPs_peptide$unique.OOPs_peptide.master_protein.)  
length(overlap)
venn <- draw.pairwise.venn(area1 =length(peptide$unique.peptide.master_protein.), area2 = length(OOPs_peptide$unique.OOPs_peptide.master_protein.), cross.area = length(overlap), category = c("total", "OOPS"),    fill = c("blue", "red"))
grid.draw(venn)
grid.newpage()
  1. RBP function analysis following BECKMANN et al 2015 methods: GO terms contain following information: ‘mRNA’ ‘splic’ ‘RNA binding’ ‘RNA’ ‘RNP’ ‘translation’ ‘ribosom’ ‘nuclease’ ‘exosome
#Finding prosite binding domains 
#Trying to find the glycoprotein enrichment with features component of UniProt.ws
#Only 263/2199 have a "glyco" feature, need to proceed with API. 
test <- select(up,
              keys = OOPs_peptide$unique.OOPs_peptide.master_protein., 
              columns = c("FEATURES", "SUBCELLULAR-LOCATIONS"), 
              keystyle = "UNIPROTKB") 
Getting extra data for P15144,O95218,Q13428,P07384,P15924,P67809
Getting extra data for O43251,P98160,Q13155,P62917,P07996,Q9UNX3
Getting extra data for Q9Y3T9,P06748,Q9Y2Z0,P78362,P27348,Q93052
Getting extra data for Q13206,Q9Y6G3,P62861,Q12959,Q9H501,O75306
Getting extra data for P10768,Q9NQW6,P15153,O14686,Q8IXB1,O14639
Getting extra data for Q9NNW7,Q13423,Q9NRY4,Q13535,O75629,O15084
'select()' returned 1:1 mapping between keys and columns

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKLS0tCgpIdW1hbiBPT1BTIGRhdGEgQ09OVEVOVAoKMS4gQWdncmVnYXRlIGludG8gbWFzdGVyLnByb3RlaW4gYW5kIFFDIGZvciBNQ0YxMEEKS2VlcCBOQyBwcm90ZWlucyByZXByZXNlbnRlZCBpbiBDTCAKRmluZCBjYXRlZ29yaWVzIG9mIHRoZSBOQy1vbmx5IHByb3RlaW5zCkZpbmQgaW50ZXJzZWN0aW9uLCBoaWdobHkgY29uZmlkZW50IFJCUCB0aHJlc2hvbGQuCkFnZ3JlZ2F0ZSBpbnRvIG1hc3Rlci5wcm90ZWluIGFuZCBRQyBmb3IgVTIwUwpLZWVwIE5DIHByb3RlaW5zIHJlcHJlc2VudGVkIGluIENMIApGaW5kIGNhdGVnb3JpZXMgb2YgdGhlIE5DLW9ubHkgcHJvdGVpbnMKQ2xhc3NpZnkgVTIwUyBpbnRvIHNlZW4gb25jZSwgdHdpY2Ugb3IgdGhyZWUtdGltZXMKRmluZCBpbnRlcnNlY3Rpb24sIGhpZ2hseSBjb25maWRlbnQgUkJQIHRocmVzaG9sZC4KCjEqLiBJbnRlcnNlY3Rpb24gYmV0d2VlbiBPT1BTIFUyMFMgZGF0YQoxKiouIEludGVyc2VjdGlvbiBiZXR3ZWVuIFZlcm9uaWNhJ3MgU0VMRVggZGF0YQpOb3QgdXNlZnVsOiBTRUxFWCBpcyByZWxhdGl2ZSwgY2Fubm90IGNvbmR1Y3QgZW5yaWNobWVudCBhbmFseXNpcy4KCjIuIEF0dGVtcHQgZm9yIFJCUCBwcm90ZWlucwoKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KFZlbm5EaWFncmFtKQpsaWJyYXJ5KGdyaWQpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShiYXNlKQpsaWJyYXJ5KG15Z2VuZSkKbGlicmFyeShyZXNoYXBlMikKc291cmNlKCJodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvYmlvY0xpdGUuUiIpCmJpb2NMaXRlKCJVbmlQcm90LndzIikKbGlicmFyeShVbmlQcm90LndzKQpiaW9jTGl0ZSgiYmlvbWFSdCIpCmxpYnJhcnkoYmlvbWFSdCkKYGBgCgoxLiBBZ2dyZWdhdGUgTUNGMTBBIHBlcHRpZGVzIGludG8gcHJvdGVpbiBpZGVudGlmaWNhdGlvbgoKYGBge3J9CnBlcHRpZGVfZGYgPC0gcmVhZC50YWJsZSgiLi4vcmF3L01DRjEwQV9zd19vbmx5X2NyYXBfY2hlY2tlZC50eHQiLCBzZXA9Ilx0IiwgaGVhZGVyPVQpCnByaW50KGhlYWQocGVwdGlkZV9kZikpCnByaW50KGRpbShwZXB0aWRlX2RmKSkKcHJpbnQodW5pcXVlKQpwcmludCh0YWJsZShwZXB0aWRlX2RmJGZpbGVuYW1lKSkKYGBgCmBgYHtyfQpjYXQoIlRhbGx5IG9mIHBlcHRpZGVzIGF0IGVhY2ggc3RhZ2U6XG4iKQpjYXQoc3ByaW50ZigiJXNcdEFsbCBwZXB0aWRlcyB3aXRoIGEgUFNNXG4iLCBsZW5ndGgocm93bmFtZXMocGVwdGlkZV9kZikpKSkKY2F0KHNwcmludGYoIlRoZXNlIHBlcHRpZGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggJXMgbWFzdGVyIHByb3RlaW5zXG4iLAogICAgICAgICAgICBsZW5ndGgodW5pcXVlKHBlcHRpZGVfZGYkbWFzdGVyX3Byb3RlaW4pKSkpCgojcHJpbnQodGFibGUocGVwdGlkZV9kZiRRdWFuLkluZm8pKQojcGVwdGlkZV9kZiA8LSBwZXB0aWRlX2RmW3BlcHRpZGVfZGYkUXVhbi5JbmZvPT0iVW5pcXVlIixdCiNjYXQoc3ByaW50ZigiJXNcdEV4Y2x1ZGluZyBwZXB0aWRlcyB3aXRob3V0ICdRdWFuLkluZm8nPSdVbmlxdWUnXG4iLCBsZW5ndGgocm93bmFtZXMocGVwdGlkZV9kZikpKSkKCnBlcHRpZGVfZGYgPC0gcGVwdGlkZV9kZltwZXB0aWRlX2RmJG1hc3Rlcl9wcm90ZWluIT0iIixdCmNhdChzcHJpbnRmKCIlc1x0RXhjbHVkaW5nIHBlcHRpZGVzIHdpdGhvdXQgYSBtYXN0ZXIgcHJvdGVpblxuIiwgbGVuZ3RoKHJvd25hbWVzKHBlcHRpZGVfZGYpKSkpCmNhdChzcHJpbnRmKCJUaGVzZSBwZXB0aWRlcyBhcmUgYXNzb2NpYXRlZCB3aXRoICVzIG1hc3RlciBwcm90ZWluc1xuIiwKICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZShwZXB0aWRlX2RmJG1hc3Rlcl9wcm90ZWluKSkpKQoKcGVwdGlkZV9kZiA8LSBwZXB0aWRlX2RmW3BlcHRpZGVfZGYkdW5pcXVlPT0xLF0KY2F0KHNwcmludGYoIiVzXHRFeGNsdWRpbmcgcGVwdGlkZXMgd2l0aG91dCBhIHVuaXF1ZSBtYXN0ZXIgcHJvdGVpblxuIiwgbGVuZ3RoKHJvd25hbWVzKHBlcHRpZGVfZGYpKSkpCmNhdChzcHJpbnRmKCJUaGVzZSBwZXB0aWRlcyBhcmUgYXNzb2NpYXRlZCB3aXRoICVzIG1hc3RlciBwcm90ZWluc1xuIiwKICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZShwZXB0aWRlX2RmJG1hc3Rlcl9wcm90ZWluKSkpKQoKcGVwdGlkZV9kZiA8LSBwZXB0aWRlX2RmW3BlcHRpZGVfZGYkY3JhcF9wcm90ZWluPT0wLF0KY2F0KHNwcmludGYoIiVzXHRFeGNsdWRpbmcgcGVwdGlkZXMgbWF0Y2hpbmcgYSBjUkFQIHByb3RlaW5cbiIsIGxlbmd0aChyb3duYW1lcyhwZXB0aWRlX2RmKSkpKQpjYXQoc3ByaW50ZigiVGhlc2UgcGVwdGlkZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCAlcyBtYXN0ZXIgcHJvdGVpbnNcbiIsCiAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUocGVwdGlkZV9kZiRtYXN0ZXJfcHJvdGVpbikpKSkKCnBlcHRpZGVfZGYgPC0gcGVwdGlkZV9kZltwZXB0aWRlX2RmJGFzc29jaWF0ZWRfY3JhcF9wcm90ZWluPT0wLF0KY2F0KHNwcmludGYoIiVzXHRFeGNsdWRpbmcgcGVwdGlkZXMgYXNzb2NpYXRlZCB3aXRoIGEgY1JBUCBwcm90ZWluXG4iLCBsZW5ndGgocm93bmFtZXMocGVwdGlkZV9kZikpKSkKY2F0KHNwcmludGYoIlRoZXNlIHBlcHRpZGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggJXMgbWFzdGVyIHByb3RlaW5zXG4iLAogICAgICAgICAgICBsZW5ndGgodW5pcXVlKHBlcHRpZGVfZGYkbWFzdGVyX3Byb3RlaW4pKSkpCgoKYGBgCgpgYGB7cn0KcHJpbnQoaGVhZChwZXB0aWRlX2RmKSkKcHJvdGVpbl9kZiA8LSBwZXB0aWRlX2RmWyxjKCJtYXN0ZXJfcHJvdGVpbiIsICJmaWxlbmFtZSIpXQpwcmludChkaW0ocHJvdGVpbl9kZikpCnByb3RlaW5fZGYgPC0gcHJvdGVpbl9kZiAlPiUgZGlzdGluY3QKcHJpbnQoZGltKHByb3RlaW5fZGYpKQpwcm90ZWluX2RmIDwtIHByb3RlaW5fZGYgJT4lIHNlcGFyYXRlKGNvbD1maWxlbmFtZSwgaW50bz1jKCJfIiwgInRyZWF0bWVudCIsICJyZXAiKSwgc2VwPSJfIikKcHJpbnQodGFibGUocHJvdGVpbl9kZiRyZXAsIHByb3RlaW5fZGYkdHJlYXRtZW50KSkKYGBgCgpJbnRlcnNlY3Rpb24gQ0wgdG8gTkMKCmBgYHtyfQpoZWFkKHByb3RlaW5fZGYpCnByb3RlaW5fZGZfTkMgPC0gcHJvdGVpbl9kZltwcm90ZWluX2RmJHRyZWF0bWVudD09J05DJyxdCmxlbmd0aCgodW5pcXVlKHByb3RlaW5fZGZfTkMkbWFzdGVyX3Byb3RlaW4pKSkKCnByb3RlaW5fZGZfQ0wgPC0gcHJvdGVpbl9kZltwcm90ZWluX2RmJHRyZWF0bWVudD09J0NMJyxdCmxlbmd0aCh1bmlxdWUocHJvdGVpbl9kZl9DTCRtYXN0ZXJfcHJvdGVpbikpCgpjb21tb24gPC0gaW50ZXJzZWN0KHByb3RlaW5fZGZfTkMkbWFzdGVyX3Byb3RlaW4sIHByb3RlaW5fZGZfQ0wkbWFzdGVyX3Byb3RlaW4pIAoKIyBUaGVyZSBhcmUgMzAgbWFzdGVycHJvdGVpbnMgaW4gTkMgbm90IGluIENMIAoKdmVubiA8LSBkcmF3LnBhaXJ3aXNlLnZlbm4oYXJlYTEgPWxlbmd0aCh1bmlxdWUocHJvdGVpbl9kZl9DTCRtYXN0ZXJfcHJvdGVpbikpLCBhcmVhMiA9IGxlbmd0aCh1bmlxdWUocHJvdGVpbl9kZl9OQyRtYXN0ZXJfcHJvdGVpbikpLCBjcm9zcy5hcmVhID0gbGVuZ3RoKGNvbW1vbiksIGNhdGVnb3J5ID0gYygiQ0wiLCAiTkMiKSwgCWZpbGwgPSBjKCJibHVlIiwgInJlZCIpKQpncmlkLmRyYXcodmVubikKZ3JpZC5uZXdwYWdlKCkKZ3JpZC5hcnJhbmdlKGdUcmVlKGNoaWxkcmVuPXZlbm4pLCB0b3A9Ik1hc3Rlcl9wcm90ZWlucyIsIGJvdHRvbT0iMzAgbm9uLW92ZXJsYXBwaW5nIGluIHRoZSBOQyBkYXRhIikKCiMgRmluZCB0aGUgSURzIG9mIHRoZXNlIDMwCnJlbV9kYXRhX21hc3RlciA8LSBzZXRkaWZmKHByb3RlaW5fZGZfTkMkbWFzdGVyX3Byb3RlaW4sIHByb3RlaW5fZGZfQ0wkbWFzdGVyX3Byb3RlaW4pCgojVG8gY29udGludWUgd2l0aCBhbmFseXNpcyBvZiB3aGljaCBwcm90ZWlucyB0aGVzZSBhcmUgbmVlZCBhIHByb3Rlb21pY3MgYmFja2dyb3VuZC4KCmBgYAoKCjEqIEludGVyc2VjdCB3aXRoIHRoZSBwcmV2aW91cyBVMjBTIGRhdGEKYGBge3J9ClBSRVBTIDwtIHJlYWRSRFMoIi4uLy4uL2ludGVncmF0aW9uL25vdGVib29rcy9hZ2dfZ2VpZ2VyX21heC5yZHMiKQpwcmludChoZWFkKFBSRVBTKSkKClBSRVBTX2FsbCA8LSBQUkVQUyAgJT4lIGZpbHRlcihQUkVQUyRzZWVuID09IFRSVUUpClBSRVBTX29uZSA8LSBQUkVQUyAgJT4lIGZpbHRlcihQUkVQUyRzZWVuX29uY2UgPT0gVFJVRSkKUFJFUFNfdHdvIDwtIFBSRVBTICAlPiUgZmlsdGVyKFBSRVBTJHNlZW5fdHdpY2UgPT0gVFJVRSkKUFJFUFNfdGhyZWUgPC0gIFBSRVBTICU+JSBmaWx0ZXIoUFJFUFMkc2Vlbl90aHJlZSA9PSBUUlVFKQojIEdpdmVuIGRhdGEgc3RydWN0dXJlLCBzaG91bGQgZ3JvdXAgdHdvIGFuZCB0aHJlZQpQUkVQU19wbHVzIDwtIFBSRVBTICU+JSBmaWx0ZXIoUFJFUFMkc2Vlbl90d2ljZSA9PSBUUlVFICYgUFJFUFMkc2Vlbl90aHJlZSA9PSBUUlVFKQoKcHJvdGVpbl9kZiA8LSBkYXRhLmZyYW1lKHVuaXF1ZShwcm90ZWluX2RmJG1hc3Rlcl9wcm90ZWluKSkKCiMjIGNvbXBhcmluZyBhbGwgVTIwUyB0byBNQ0YxMEEKY29tbW9uIDwtIGludGVyc2VjdChQUkVQU19hbGwkbWFzdGVyX3Byb3RlaW4sIHByb3RlaW5fZGYkdW5pcXVlLnByb3RlaW5fZGYubWFzdGVyX3Byb3RlaW4uKSAgCmxlbmd0aChjb21tb24pCiMgMTcxMC4gUHJvcG9ydGlvbgpwcmludChsZW5ndGgoY29tbW9uKS9ucm93KFBSRVBTX2FsbCkpCgojIyBjb21wYXJpbmcgb25jZSBVMjBTIHRvIE1DRjEwQQpjb21tb25fb25lIDwtIGludGVyc2VjdChQUkVQU19vbmUkbWFzdGVyX3Byb3RlaW4sIHByb3RlaW5fZGYkdW5pcXVlLnByb3RlaW5fZGYubWFzdGVyX3Byb3RlaW4uKSAgCmxlbmd0aChjb21tb25fb25lKQojIDIwNC4gUHJvcG9ydGlvbgpwcmludChsZW5ndGgoY29tbW9uX29uZSkvbnJvdyhQUkVQU19vbmUpKQoKIyMgY29tcGFyaW5nIHR3aWNlIFUyMFMgdG8gTUNGMTBBCmNvbW1vbl90d28gPC0gaW50ZXJzZWN0KFBSRVBTX3R3byRtYXN0ZXJfcHJvdGVpbiwgcHJvdGVpbl9kZiR1bmlxdWUucHJvdGVpbl9kZi5tYXN0ZXJfcHJvdGVpbi4pICAKbGVuZ3RoKGNvbW1vbl90d28pCiMgMTUwNi4gUHJvcG9ydGlvbgpwcmludChsZW5ndGgoY29tbW9uX3R3bykvbnJvdyhQUkVQU190d28pKQoKIyMgY29tcGFyaW5nIHRocmVlIFUyMFMgdG8gTUNGMTBBCmNvbW1vbl90aHJlZSA8LSBpbnRlcnNlY3QoUFJFUFNfdGhyZWUkbWFzdGVyX3Byb3RlaW4sIHByb3RlaW5fZGYkdW5pcXVlLnByb3RlaW5fZGYubWFzdGVyX3Byb3RlaW4uKSAgCmxlbmd0aChjb21tb25fdGhyZWUpCiMgMTIwOC4gUHJvcG9ydGlvbgpwcmludChsZW5ndGgoY29tbW9uX3RocmVlKS9ucm93KFBSRVBTX3RocmVlKSkKCnQgPC0gcmVhZC50YWJsZSh0ZXh0ID0gIlBST1AgVE9UQUwKQUxMIDAuMjkgMTcxMApPTkUgMC4yOCAyMDQKVFdPIDAuNjkgMTUwNgpUSFJFRSAwLjc2IDEyMDgiLCBoZWFkZXIgPSBUUlVFKQogICAgICAgICAgICAgICAKcGxvdCh0JFBST1AsIHR5cGUgPSAibCIpCiNDYW5ub3QgbWFrZSBkaXJlY3QgY29uY2x1c2lvbnMuIERhdGEgY29sbGF0ZWQgaW4gc3VjaCBhIG1hbm5lciB0aGF0IHByb3RlaW5zIHNlZW4gb25seSAxIGluIE9OQ0UuIFRXTyBhbmQgVEhSRUUgYXJlIG92ZXJsYXBwaW5nLiAKCgp2ZW5uLnBsb3QyIDwtZHJhdy5xdWFkLnZlbm4oMjE5OSwgNzIzLCAyMTc3LCAxNjc5LCAyMDQsIDE1MDYsIDEyODAsIDAsIDAsIDE2NzksIDAsIDAsIDEyODAsIDAsIDAsIGNhdGVnb3J5ID0gYygiTUNGMTBhIiwgIlUyMFMoMSkiLCAiVTIwUygyKSIsICJVMjBTKDMpIiksIGx3ZCA9IHJlcCgyLCA0KSwgbHR5ID0gcmVwKCJzb2xpZCIsIDQpLCBjb2wgPSByZXAoImJsYWNrIiwgNCksIGZpbGwgPSBjKCJyZWQiLCAiYmx1ZSIsICJncmVlbiIsICJ5ZWxsb3ciKSwgYWxwaGEgPSByZXAoMC41LCA0KSxsYWJlbC5jb2wgPSByZXAoImJsYWNrIiwgMTUpLCBjZXggPSByZXAoMSwgMTUpLGZvbnRmYWNlID0gcmVwKCJwbGFpbiIsIDE1KSwgZm9udGZhbWlseSA9IHJlcCgic2VyaWYiLDE1KSwgY2F0LnBvcyA9IGMoLTE1LCAxNSwgMCwgMCksIGNhdC5kaXN0ID0gYygwLjIyLCAwLjIyLCAwLjExLCAwLjExKSwgY2F0LmNvbCA9IHJlcCgiYmxhY2siLCA0KSwgY2F0LmNleCA9IHJlcCgxLCA0KSwgY2F0LmZvbnRmYWNlID0gcmVwKCJwbGFpbiIsIDQpLCBjYXQuZm9udGZhbWlseSA9IHJlcCgic2VyaWYiLCA0KSwgY2F0Lmp1c3QgPSByZXAobGlzdChjKDAuNSwgMC41KSksIDQpLCByb3RhdGlvbi5kZWdyZWUgPSAwLCByb3RhdGlvbi5jZW50cmUgPSBjKDAuNSwgMC41KSwgaW5kID0gVFJVRSwgY2V4LnByb3AgPSBOVUxMLCBwcmludC5tb2RlID0gInJhdyIsIHNpZ2RpZ3MgPSAzLCBkaXJlY3QuYXJlYSA9IEZBTFNFLCBhcmVhLnZlY3RvciA9IDApCgoKZ3JpZC5kcmF3KHZlbm4ucGxvdDIpCgojIyBXYW50IHRvIGFuYWx5emUgdGhlICJoaWdoLWNvbmZpZGVuY2UiIFJCUAoKcyA8LSBpbnRlcnNlY3QocHJvdGVpbl9kZiR1bmlxdWUucHJvdGVpbl9kZi5tYXN0ZXJfcHJvdGVpbi4sIFBSRVBTX3BsdXMkbWFzdGVyX3Byb3RlaW4pCi4uLgoKYGBgCgoxKiogTUNGMTBBIHZlcnN1cyBWZXJvbmljYSBhbmFseXNpcyAKCgpgYGB7cn0KI1VwbG9hZCBWZXJvbmljYSdzIGRhdGEKcGVwdGlkZSA8LSByZWFkLnRhYmxlKCIvVXNlcnMvY2lyb21vbnRpL0RvY3VtZW50cy9HaXRIdWIvVGhyZWVUcy9wcm90ZW9taWNzL3RyaXpvbC9NQ0YxMEEvcmF3L1Zlcm9uaWNhX1RNVF8xMF9QbGV4X0ZfUGVwdGlkZUdyb3Vwc19zd19vbmx5X2NyYXBfY2hlY2tlZC50eHQiLCBzZXA9Ilx0IiwgaGVhZGVyPVQpCiNjaGFuZ2UgZGlyZWN0b3J5IHVuIFJTdHVkaW8gdG8gbWFrZSBkYXRhIG1vcmUgcmVhZGlseSBhY2Nlc2libGUgCnByaW50KGhlYWQocGVwdGlkZSkpCnByaW50KGRpbShwZXB0aWRlKSkKcHJpbnQoY29sbmFtZXMocGVwdGlkZSkpCmBgYApgYGB7cn0KI1FDIG9mIHRoZSBkYXRhc2V0IGJlZm9yZSByZW1vdmluZyB0aGUgTWFzdGVyLlByb3RlaW5zLgojQ2FuIHVzZSBzcHJpbnRmIHRvIHByaW50IHRoZSB0aGUgbnVtYmVyIG9mIHBlcHRpZGVzIGxvc3QgYXQgZWFjaCBzdGVwLiAKI1JlbW92ZSB0aGUgY1JBUCBwcm90ZWlucwpwZXB0aWRlIDwtIHBlcHRpZGUgICU+JSBmaWx0ZXIocGVwdGlkZSRjcmFwX3Byb3RlaW4gPT0gMCkKI1JlbW92ZSB0aGUgY1JBUCBhc3NvY2lhdGVkIHByb3RlaW5zCnBlcHRpZGUgPC0gcGVwdGlkZSAlPiUgZmlsdGVyKHBlcHRpZGUkYXNzb2NpYXRlZF9jcmFwX3Byb3RlaW4gPT0gMCkKI0tlZXAgcHJvdGVpbnMgYXNzb2NpdGVkIHRvIGEgdW5pcXVlIG1hc3RlciBwcm90ZWluCnBlcHRpZGUgPC0gcGVwdGlkZSAlPiUgZmlsdGVyKHBlcHRpZGUkdW5pcXVlID09IDEpCmRpbShwZXB0aWRlKQoKcGVwdGlkZSA8LSBwZXB0aWRlWywgYygiU2VxdWVuY2UiLCAibWFzdGVyX3Byb3RlaW4iKV0KbGVuZ3RoKHBlcHRpZGUkbWFzdGVyX3Byb3RlaW4pCnBlcHRpZGUgPC0gZGF0YS5mcmFtZSh1bmlxdWUocGVwdGlkZSRtYXN0ZXJfcHJvdGVpbikpCiNUaGlzIGlzIHRoZSBwcm90ZW9taWNzIGJhY2tncm91bmQgZm9yIE1DRjEwQS4gQ2F2ZWF0IHRoZXNlIGFyZSBub3QgYmFzZWxpbmUgY29uZGl0aW9uczogaW5zdWxpbi1zdGFydmVkIG9yIGluc3VsaW4tZW5yaWNoZWQuIApgYGAKCmBgYHtyfQpPT1BzX3BlcHRpZGUgPC0gcmVhZC50YWJsZSgiL1VzZXJzL2Npcm9tb250aS9Eb2N1bWVudHMvR2l0SHViL1RocmVlVHMvcHJvdGVvbWljcy90cml6b2wvTUNGMTBBL3Jhdy9NQ0YxMEFfc3dfb25seV9jcmFwX2NoZWNrZWQudHh0Iiwgc2VwPSJcdCIsIGhlYWRlcj1UKQpPT1BzX3BlcHRpZGUgPC0gT09Qc19wZXB0aWRlICU+JSBmaWx0ZXIoT09Qc19wZXB0aWRlJGNyYXBfcHJvdGVpbiA9PSAwKQpPT1BzX3BlcHRpZGUgPC0gT09Qc19wZXB0aWRlICU+JSBmaWx0ZXIoT09Qc19wZXB0aWRlJGFzc29jaWF0ZWRfY3JhcF9wcm90ZWluID09IDApCk9PUHNfcGVwdGlkZSA8LSBPT1BzX3BlcHRpZGUgJT4lIGZpbHRlcihPT1BzX3BlcHRpZGUkdW5pcXVlID09IDEpCgogICNOZWVkIHRvIGNoZWNrIHN5bnRheCBvZiBtYWtpbmcgYSBjb250aW51b3VzIGxpbmUKICAjZmlsdGVyKE9PUHNfcGVwdGlkZSRjcmFwX3Byb3RlaW4gPT0gMCkgJT4lCiAgI2ZpbHRlcihPT1BzX3BlcHRpZGUkYXNzb2NpYXRlZF9jcmFwX3Byb3RlaW4gPT0gMCkgJT4lIAogICNmaWx0ZXIoT09Qc19wZXB0aWRlJHVuaXF1ZSA9PSAxKQoKT09Qc19wZXB0aWRlIDwtIE9PUHNfcGVwdGlkZVssIGMoIlNlcXVlbmNlIiwgIm1hc3Rlcl9wcm90ZWluIildCmxlbmd0aChPT1BzX3BlcHRpZGUkbWFzdGVyX3Byb3RlaW4pCk9PUHNfcGVwdGlkZSA8LSBkYXRhLmZyYW1lKHVuaXF1ZShPT1BzX3BlcHRpZGUkbWFzdGVyX3Byb3RlaW4pKQpgYGAKCmBgYHtyfQojSW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIGRhdGFzZXRzIApvdmVybGFwIDwtIGludGVyc2VjdChwZXB0aWRlJHVuaXF1ZS5wZXB0aWRlLm1hc3Rlcl9wcm90ZWluLiwgT09Qc19wZXB0aWRlJHVuaXF1ZS5PT1BzX3BlcHRpZGUubWFzdGVyX3Byb3RlaW4uKSAgCmxlbmd0aChvdmVybGFwKQp2ZW5uIDwtIGRyYXcucGFpcndpc2UudmVubihhcmVhMSA9bGVuZ3RoKHBlcHRpZGUkdW5pcXVlLnBlcHRpZGUubWFzdGVyX3Byb3RlaW4uKSwgYXJlYTIgPSBsZW5ndGgoT09Qc19wZXB0aWRlJHVuaXF1ZS5PT1BzX3BlcHRpZGUubWFzdGVyX3Byb3RlaW4uKSwgY3Jvc3MuYXJlYSA9IGxlbmd0aChvdmVybGFwKSwgY2F0ZWdvcnkgPSBjKCJ0b3RhbCIsICJPT1BTIiksIAlmaWxsID0gYygiYmx1ZSIsICJyZWQiKSkKZ3JpZC5kcmF3KHZlbm4pCmdyaWQubmV3cGFnZSgpCgpgYGAKCgoyLiBSQlAgZnVuY3Rpb24gYW5hbHlzaXMgZm9sbG93aW5nIEJFQ0tNQU5OIGV0IGFsIDIwMTUgbWV0aG9kczogR08gdGVybXMgY29udGFpbiBmb2xsb3dpbmcgaW5mb3JtYXRpb246IOKAmG1STkHigJkg4oCYc3BsaWPigJkg4oCYUk5BIGJpbmRpbmfigJkg4oCYUk5B4oCZIOKAmFJOUOKAmSDigJh0cmFuc2xhdGlvbuKAmSDigJhyaWJvc29t4oCZIOKAmG51Y2xlYXNlJyDigJhleG9zb21lCgoKYGBge3J9CmF2YWlsYWJsZVVuaXByb3RTcGVjaWVzKHBhdHRlcm4gPSAic2FwaWVucyIpICNGaW5kIHRheG9uIElEIGZvciBodW1hbiBzcGVjaWVzIAp1cCA8LSBVbmlQcm90LndzKHRheElkID0gOTYwNikgI0dlbmVyYXRpbmcgYSBVbmlQcm90LndzIG9iamVjdCBmb3IgSG9tbyBTYXBpZW5zCgpwZXB0aWRlcl9PT1BTIDwtIHNlbGVjdCh1cCwKICAgICAgICAgICAgICBrZXlzID0gT09Qc19wZXB0aWRlJHVuaXF1ZS5PT1BzX3BlcHRpZGUubWFzdGVyX3Byb3RlaW4uLCAKICAgICAgICAgICAgICBjb2x1bW5zID0gYygiR08tSUQiLCAiRU5TRU1CTCIsICJHTyIpLCAKICAgICAgICAgICAgICBrZXlzdHlsZSA9ICJVTklQUk9US0IiKSAjUmV0cmlldmUgR08gSUQgYW5kIEdPIHRlcm1zIAojQ2F1dGlvbjogZGF0YXNldCBoYXMgZXhwYW5lZGVkIHdpdGggdGhlIHRyYW5zZmVyIGJldHdlZW4gSURzLiBGcm9tIDIxOTkgdG8gMjM5MQp4IDwtIHBlcHRpZGVyX09PUFMgI2ZpeCB0aGlzIGRhdGFiYXNlIAoKdG9NYXRjaCA8LSBjKCJtUk5BIiwgInNwbGljIiwgIlJOQSBiaW5kaW5nIiwgIlJOQSIsICJSTlAiLCAidHJhbnNsYXRpb24iLCAicmlib3NvbSIsICJudWNsZWFzZSIsICJleG9zb21lIikKa25vd25fUkJQIDwtIGdyZXAocGFzdGUodG9NYXRjaCxjb2xsYXBzZT0ifCIpLCBwZXB0aWRlcl9PT1BTJEdPLCB2YWx1ZSA9IFRSVUUpCnByaW50KGxlbmd0aChrbm93bl9SQlApKQppbmRleCA8LSBncmVwKHBhc3RlKHRvTWF0Y2gsY29sbGFwc2U9InwiKSwgcGVwdGlkZXJfT09QUyRHTywgdmFsdWUgPSBGQUxTRSkKCmtub3duIDwtIHBlcHRpZGVyX09PUFNbaW5kZXgsIF0gCnVua25vd24gPC0gcGVwdGlkZXJfT09QU1staW5kZXgsIF0KCmMgPC0gYyhsZW5ndGgoa25vd24kVU5JUFJPVEtCKSwgbGVuZ3RoKHVua25vd24kVU5JUFJPVEtCKSkKYmFycGxvdChjLCB3aWR0aCA9IDAuNSwgeGxhYiA9ICJrbm93biB2ZXJzdXMgdW5rbm93biIpCnByaW50KHVua25vd24kR08pCgpNYXRjaCA8LSBjKCJtZW1icmFuZSIsICJqdW5jdGlvbiIsICJjb3J0ZXgiKQp1bmtub3duX3NwIDwtIGdyZXAocGFzdGUoTWF0Y2gsY29sbGFwc2UgPSAifCIpLCB1bmtub3duJEdPLCB2YWx1ZSA9IEZBTFNFKQphbGxfZ2x5IDwtIGdyZXAocGFzdGUoTWF0Y2gsY29sbGFwc2UgPSAifCIpLCBwZXB0aWRlcl9PT1BTJEdPLCB2YWx1ZSA9IEZBTFNFKQoKI0ZpbmRpbmcgcHJvc2l0ZSBiaW5kaW5nIGRvbWFpbnMgCiNUcnlpbmcgdG8gZmluZCB0aGUgZ2x5Y29wcm90ZWluIGVucmljaG1lbnQgd2l0aCBmZWF0dXJlcyBjb21wb25lbnQgb2YgVW5pUHJvdC53cwojT25seSAyNjMvMjE5OSBoYXZlIGEgImdseWNvIiBmZWF0dXJlLCBuZWVkIHRvIHByb2NlZWQgd2l0aCBBUEkuIAojQ29uc2lkZXJpbmcgbG9jYXRpb24gNjIxLzIxOTkgYXQganVuY3Rpb24gYW5kL29yIG1lbWJyYW5lIAp0ZXN0IDwtIHNlbGVjdCh1cCwKICAgICAgICAgICAgICBrZXlzID0gT09Qc19wZXB0aWRlJHVuaXF1ZS5PT1BzX3BlcHRpZGUubWFzdGVyX3Byb3RlaW4uLCAKICAgICAgICAgICAgICBjb2x1bW5zID0gYygiRkVBVFVSRVMiLCAiU1VCQ0VMTFVMQVItTE9DQVRJT05TIiksIAogICAgICAgICAgICAgIGtleXN0eWxlID0gIlVOSVBST1RLQiIpIAp0ZXN0X2dseSA8LSBncmVwKHBhdHRlcm4gPSAiR2x5Y28iLCB0ZXN0JEZFQVRVUkVTLCB2YWx1ZSA9IEZBTFNFLCBpZ25vcmUuY2FzZSA9IFRSVUUpCnByaW50KGxlbmd0aCh0ZXN0X2dseSkpCnRlc3RfZ2x5X2xvYyA8LSBncmVwKHBhdHRlcm4gPSAibWVtYnJhbmUgfCBqdW5jdGlvbiIsIHRlc3QkYFNVQkNFTExVTEFSLUxPQ0FUSU9OU2AsIHZhbHVlID0gRkFMU0UsIGlnbm9yZS5jYXNlID0gVFJVRSkKcHJpbnQobGVuZ3RoKHRlc3RfZ2x5X2xvYykpCiNBdHRlbXB0IHdpdGggUFRNIGZvciBnbHljb3Byb3RlaW5zCgoKCmBgYAoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDdHJsK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuCg==